<?php
// +----------------------------------------------------------------------
// | ThinkCMF [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013-present http://www.thinkcmf.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +---------------------------------------------------------------------
// | Author: Dean <zxxjjforever@163.com>
// +----------------------------------------------------------------------
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use think\facade\Db;
use cmf\model\OptionModel;
use think\facade\Env;
use dir\Dir;
use think\facade\Route;
use cmf\lib\Storage;
use PhpOffice\PhpSpreadsheet\Reader\Xls;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;


use think\exception\ValidateException;
use think\facade\Filesystem;


function cmf_install_log($params, $table, $action)
{
    $params['admin_id'] = cmf_get_current_admin_id();
    $params['addtime'] = time();
    $params['action'] = $action;
//    var_dump($params);
    Db::name($table)->insertGetId($params);
}

/**
 * 导出excel表
 * $data：要导出excel表的数据，接受一个二维数组
 * $name：excel表的表名
 * $head：excel表的表头，接受一个一维数组
 * $key：$data中对应表头的键的数组，接受一个一维数组
 * 备注：此函数缺点是，表头（对应列数）不能超过26；
 *循环不够灵活，一个单元格中不方便存放两个数据库字段的值
 */

/**
 * 导出excel表
 * $data：要导出excel表的数据，接受一个二维数组
 * $name：excel表的表名
 * $head：excel表的表头，接受一个一维数组
 * $key：$data中对应表头的键的数组，接受一个一维数组
 * 备注：此函数缺点是，表头（对应列数）不能超过26；
 *循环不够灵活，一个单元格中不方便存放两个数据库字段的值
 */
function excel_out($name = '测试表', $data = [], $head = [], $keys = [])
{
    $count = count($head);  //计算表头数量

    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();

    for ($i = 65; $i < $count + 65; $i++) {     //数字转字母从65开始，循环设置表头：
        $sheet->setCellValue(strtoupper(chr($i)) . '1', $head[$i - 65]);
    }

    /*--------------开始从数据库提取信息插入Excel表中------------------*/


    foreach ($data as $key => $item) {             //循环设置单元格：
        //$key+2,因为第一行是表头，所以写到表格时   从第二行开始写

        for ($i = 65; $i < $count + 65; $i++) {     //数字转字母从65开始：
            $sheet->setCellValue(strtoupper(chr($i)) . ($key + 2), $item[$keys[$i - 65]]);
            $spreadsheet->getActiveSheet()->getColumnDimension(strtoupper(chr($i)))->setWidth(20); //固定列宽
        }

    }
    ob_end_clean();
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="' . $name . '.xlsx"');
    header('Cache-Control: max-age=0');
    $writer = new Xlsx($spreadsheet);
    $writer->save('php://output');

    //删除清空：
    $spreadsheet->disconnectWorksheets();
    unset($spreadsheet);
    exit;
}

/**
 * 导出excel
 * @param $strTable    表格内容
 * @param $filename 文件名
 */
function downloadExcel($strTable, $filename)
{
    header("Content-type: application/vnd.ms-excel");
    header("Content-Type: application/force-download");
    header("Content-Disposition: attachment; filename=" . $filename . "_" . date('Y-m-d') . ".xls");
    header('Expires:0');
    header('Pragma:public');
    echo '<html><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' . $strTable . '</html>';
}

/**
 * 自定义导出表格  可根据表格导出内容统计  demo
 */
//
//public function export_user(){
//    $strTable ='<table width="500" border="1">';
//    $strTable .= '<tr>';
//    $strTable .= '<td style="text-align:center;font-size:12px;width:120px;">会员ID</td>';
//    $strTable .= '<td style="text-align:center;font-size:12px;" width="100">会员昵称</td>';
//    $strTable .= '<td style="text-align:center;font-size:12px;" width="*">会员等级</td>';
//    $strTable .= '<td style="text-align:center;font-size:12px;" width="*">手机号</td>';
//    $strTable .= '<td style="text-align:center;font-size:12px;" width="*">邮箱</td>';
//    $strTable .= '<td style="text-align:center;font-size:12px;" width="*">注册时间</td>';
//    $strTable .= '<td style="text-align:center;font-size:12px;" width="*">最后登陆</td>';
//    $strTable .= '<td style="text-align:center;font-size:12px;" width="*">余额</td>';
//    $strTable .= '<td style="text-align:center;font-size:12px;" width="*">积分</td>';
//    $strTable .= '<td style="text-align:center;font-size:12px;" width="*">累计消费</td>';
//    $strTable .= '</tr>';
//    $user_id_array = trim(I('user_id_array'),',');
//    $where = [];
//    if($user_id_array){
//        $where = ['user_id'=>['in',$user_id_array]];
//    }
//    $count = \think\Db::name('users')->where($where)->count();
//    $p = ceil($count/5000);
//    for($i=0;$i<$p;$i++){
//        $start = $i*5000;
//        $end = ($i+1)*5000;
//        $userList = Db::name('users')->where($where)->order('user_id')->limit($start,5000)->select();
//        if(is_array($userList)){
//            foreach($userList as $k=>$val){
//                $strTable .= '<tr>';
//                $strTable .= '<td style="text-align:center;font-size:12px;">'.$val['user_id'].'</td>';
//                $strTable .= '<td style="text-align:left;font-size:12px;">'.$val['nickname'].' </td>';
//                $strTable .= '<td style="text-align:left;font-size:12px;">'.$val['level'].'</td>';
//                $strTable .= '<td style="text-align:left;font-size:12px;">'.$val['mobile'].'</td>';
//                $strTable .= '<td style="text-align:left;font-size:12px;">'.$val['email'].'</td>';
//                $strTable .= '<td style="text-align:left;font-size:12px;">'.date('Y-m-d H:i',$val['reg_time']).'</td>';
//                $strTable .= '<td style="text-align:left;font-size:12px;">'.date('Y-m-d H:i',$val['last_login']).'</td>';
//                $strTable .= '<td style="text-align:left;font-size:12px;">'.$val['user_money'].'</td>';
//                $strTable .= '<td style="text-align:left;font-size:12px;">'.$val['pay_points'].' </td>';
//                $strTable .= '<td style="text-align:left;font-size:12px;">'.$val['total_amount'].' </td>';
//                $strTable .= '</tr>';
//            }
//            unset($userList);
//        }
//    }
//    $strTable .='</table>';
//    downloadExcel($strTable,'users_'.$i);
//    exit();
//}
/**
 * 使用PHPEXECL导入
 *
 * @param string $file 文件地址
 * @param int $sheet 工作表sheet(传0则获取第一个sheet)
 * @param int $columnCnt 列数(传0则自动获取最大列)
 * @param array $options 操作选项
 *                          array mergeCells 合并单元格数组
 *                          array formula    公式数组
 *                          array format     单元格格式数组
 *
 * @return array
 * @throws Exception
 */
function importExecl($file = '', $sheet = 0, $columnCnt = 0, &$options = [])
{
    try {        /* 转码 */
        $file = iconv("utf-8", "gb2312", $file);
        if (empty($file) or !file_exists($file)) {
            throw new \Exception('文件不存在!');
        }
        /** @var Xlsx $objRead */
        $objRead = IOFactory::createReader('Xlsx');
        if (!$objRead->canRead($file)) {
            /** @var Xls $objRead */
            $objRead = IOFactory::createReader('Xls');
            if (!$objRead->canRead($file)) {
                throw new \Exception('只支持导入Excel文件！');
            }
        }        /* 如果不需要获取特殊操作，则只读内容，可以大幅度提升读取Excel效率 */
        empty($options) && $objRead->setReadDataOnly(true);        /* 建立excel对象 */
        $obj = $objRead->load($file);        /* 获取指定的sheet表 */
        $currSheet = $obj->getSheet($sheet);
        if (isset($options['mergeCells'])) {            /* 读取合并行列 */
            $options['mergeCells'] = $currSheet->getMergeCells();
        }
        if (0 == $columnCnt) {            /* 取得最大的列号 */
            $columnH = $currSheet->getHighestColumn();            /* 兼容原逻辑，循环时使用的是小于等于 */
            $columnCnt = Coordinate::columnIndexFromString($columnH);
        }        /* 获取总行数 */
        $rowCnt = $currSheet->getHighestRow();
        $data = [];        /* 读取内容 */
        for ($_row = 1; $_row <= $rowCnt; $_row++) {

            $isNull = true;
            for ($_column = 1; $_column <= $columnCnt; $_column++) {
                $cellName = Coordinate::stringFromColumnIndex($_column);
                $cellId = $cellName . $_row;
                $cell = $currSheet->getCell($cellId);
                if (isset($options['format'])) {                    /* 获取格式 */
                    $format = $cell->getStyle()->getNumberFormat()->getFormatCode();                    /* 记录格式 */
                    $options['format'][$_row][$cellName] = $format;
                }
                if (isset($options['formula'])) {                    /* 获取公式，公式均为=号开头数据 */
                    $formula = $currSheet->getCell($cellId)->getValue();
                    if (0 === strpos($formula, '=')) {
                        $options['formula'][$cellName . $_row] = $formula;
                    }
                }
                if (isset($format) && 'm/d/yyyy' == $format) {                    /* 日期格式翻转处理 */
                    $cell->getStyle()->getNumberFormat()->setFormatCode('yyyy/mm/dd');
                }
                var_dump(trim($data[$_row][$cellName]));
                var_dump(trim($currSheet->getCell($cellId)->getFormattedValue()));
                $data[$_row][$cellName] = trim($currSheet->getCell($cellId)->getFormattedValue());
                if (!empty($data[$_row][$cellName])) {
                    $isNull = false;
                }
            }            /* 判断是否整行数据为空，是的话删除该行数据 */
            if ($isNull) {
                unset($data[$_row]);
            }
        }
        return $data;
    } catch (\Exception $e) {
        throw $e;
    }
}

// excel导入
function inpor($filename = "")
{
    $file[] = $filename;
    try {
        // 验证文件大小，名称等是否正确
        validate(['file' => 'filesize:51200|fileExt:xls,xlsx'])
            ->check($file);
        // 将文件保存到本地
        $savename = Filesystem::putFile('topic', $file[0]);
        // 截取后缀
        $fileExtendName = substr(strrchr($savename, '.'), 1);
        // 有Xls和Xlsx格式两种
        if ($fileExtendName == 'xlsx') {
            $objReader = IOFactory::createReader('Xlsx');
        } else {
            $objReader = IOFactory::createReader('Xls');
        }
        // 设置文件为只读
        $objReader->setReadDataOnly(TRUE);
        // 读取文件，tp6默认上传的文件，在runtime的相应目录下，可根据实际情况自己更改
        $objPHPExcel = $objReader->load(public_path() . 'storage/' . $savename);
        //excel中的第一张sheet
        $sheet = $objPHPExcel->getSheet(0);
        // 取得总行数
        $highestRow = $sheet->getHighestRow();
        // 取得总列数
        $highestColumn = $sheet->getHighestColumn();
        Coordinate::columnIndexFromString($highestColumn);
        $lines = $highestRow - 1;
        if ($lines <= 0) {
            echo('数据不能为空！');
            exit();
        }
        // 直接取出excle中的数据
        $data = $objPHPExcel->getActiveSheet()->toArray();
        // 删除第一个元素（表头）
        array_shift($data);
        // 返回结果
        return $data;
    } catch (ValidateException $e) {
        return $e->getMessage();
    }
}
    function getname($type)
    {


        $typearray = array(1 => 'C', 2 => 'S', 3 => 'F', 4 => 'B', 5 => 'T', 6 => 'FB', 7 => 'Y',8=>'W');
        $log = $typearray[$type];
        $today = date('ymd', time());
//        $this->success('ok', '',$today);
        $newnum = Db::name('plate_num')->where('today', $today)->order('id desc')->find();
        if ($newnum) {
            Db::name('plate_num')->insertGetId(array('today' => $today, 'order_num' => $newnum['order_num'] + 1, 'addtime' => time(),
                'admin_id' => cmf_get_current_admin_id()));
            $dd = str_pad($newnum['order_num'] + 1, 5, '0', STR_PAD_LEFT);
            $name = $log . $today . $dd;

        } else {
            Db::name('plate_num')->insertGetId(array('today' => $today, 'order_num' => 1, 'addtime' => time(),
                'admin_id' => cmf_get_current_admin_id()));
            $dd = str_pad(1, 5, '0', STR_PAD_LEFT);

            $name = $log . $today . $dd;

        }
        return $name;
    }

